//
//  STUserAccountViewModel.swift
//  Demo-04-TabBarTest
//
//  Created by 苏统世 on 16/5/13.
//  Copyright © 2016年 SuTon. All rights reserved.
//

import UIKit

class STUserAccountViewModel: NSObject {

    static let shareManager:STUserAccountViewModel=STUserAccountViewModel()
    
    /// 账号归档和解档的路径
    let userAccountPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! + "/account.plist"
    
    /// 账号,全局只要拿到单例就可以访问
    var userAccount: STUserAccount?
    
    /// 用户是否登录的属性
    var isUserLogin: Bool {
        get {
            return userAccount != nil   // 账号!=nil就表示登录了
        }
    }
    
    override init() {
        super.init()
        // 加载沙盒里面的账号,赋值给userAccount, 只需要加载一次
        // 解档账号
        userAccount = loadUserAccount()
    }
    /// 解档账号
    func loadUserAccount() -> STUserAccount? {
        // 解档对象
        if let userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(self.userAccountPath) as? STUserAccount {
            // 加载到了账号, 判断是否过期
            // userAccount.expiresDate 和当前时间比较
            // NSDate(): 当前时间
            // userAccount.expiresDate < NSDate() 过期的
            // 测试:1.改系统时间 2.改userAccount.expiresDate属性,早期的时间
            //            userAccount.expiresDate = NSDate(timeIntervalSinceNow: -1000)
            if userAccount.expiresDate?.compare(NSDate()) != NSComparisonResult.OrderedAscending {
                // 没有过期
                STPrint(items: "没有过期")
                return userAccount
            } else {
                return nil
            }
        } else {
            // 没有加载出账号
            return nil
        }
    }
    /// 发送POST请求获取AccessToken
    func loadAccessToken(code: String, callback: (error: NSError?) -> ()) {
        // 如果urlString里面开头是http或https就直接使用这个urlString,如果不是以http或https开头AFN会帮我们拼接baseURL
        let urlString = "oauth2/access_token"
        // 参数
        let parameters = [
            "client_id" : client_id,            //申请应用时分配的AppKey。
            "client_secret" : client_secret,    //申请应用时分配的AppSecret。
            "grant_type" : "authorization_code",//请求的类型，填写authorization_code
            "code" : code,                      //调用authorize获得的code值。
            "redirect_uri": redirect_uri        //回调地址，需需与注册应用里的回调地址一致。
        ]
        // 如果已经授权成功消息在授权的时候不会再看到这个界面,相当于新浪会自动帮我们点击授权按钮,
        // 如果还想自己来收取需要去网站上面取消授权
        STNetworkTool.netManager.request(RequestMethod.POST, URLString: urlString, parameters: parameters, success: { (task, responseObject) -> Void in
            STPrint(items: "获取AccessToken成功: \(responseObject)")
            
            // 判断返回的数据是否能够转成字典
            if let result = responseObject as? [String: AnyObject] {
                // 字典转模型
                let userAccount = STUserAccount(dict: result)
//                STPrint(items: "userAccount: \(userAccount)")
//                STPrint(items: "userAccountPath: \(self.userAccountPath)")
                
                // 将账号赋值给属性
                self.userAccount = userAccount
                // 调用归档的方法,将模型归档到沙盒里面
//                NSKeyedArchiver.archiveRootObject(userAccount, toFile: self.userAccountPath)
                self.saveUserAccountToSanbox()
                // 告诉控制器,模型保存完成了
                callback(error: nil)
            } else {
                STPrint(items: "返回数据转字典失败了")
            }
            }, failure: { (task, error) -> Void in
                callback(error: error)
        })
    }
    /// 保存账号到沙盒中
    private func saveUserAccountToSanbox(){
        if let account=userAccount {
            NSKeyedArchiver.archiveRootObject(account, toFile: userAccountPath)
        }
    }
// MARK: - 获取加载用户名称和头像
    
    func loadUserAccountInfo(infoBlock:()->()){
        
        /// 获取加载用户名称和头像 URL
        let userInfoURL = "2/users/show.json"
        
        guard let access_token=userAccount?.access_token else{ return }
        guard let uid=userAccount?.uid else{ return }
        
        let parameter = [ "access_token":access_token, "uid":uid]
        
        STNetworkTool.netManager.request(RequestMethod.GET, URLString: userInfoURL, parameters: parameter, success: { (_, respondData) -> Void in
//            STPrint(items: "获取到的响应数据：\(respondData)")
            
            if let resultDict = respondData as? [String:AnyObject]{
                
                self.userAccount?.screen_name = resultDict["screen_name"] as? String
                self.userAccount?.avatar_large = resultDict["avatar_large"] as? String
                
                self.saveUserAccountToSanbox()
                //执行信息回调
                infoBlock()
            }
            }) { (_, error) -> Void in
                STPrint(items: "出错了：\(error)")
        }
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
}
